查看原文
其他

多租户机制概述

2017-11-10 OceanBase

OceanBase数据库作为一个扩展性很强的集群系统,设计的目标就包括使用一个集群支持多个业务系统,也就是通常所说的多租户特性。数据库多租户概念,Oracle是从12C版本开始支持的,在Oracle里面,最重要的两个概念是CDBContainer DB)和PDBPluggable DB)。从1.0版本开始,OceanBase开始支持多租户。租户是数据库对象管理和资源管理的基础;对于系统运维,尤其是对于云数据库运维有重要的影响。

OceanBase的多租户特性,从设计目标来看,主要包含如下几点:

  1. 将多个数据库实例管理和运维的成本和复杂性降低到和一个数据库实例相当。OceanBase的一大优势就是大集群的规模优势,取得这个优势的一个重要原因就是原先的多个数据库实例,在1.x版本中管理的成本相当于一个实例。

  2. 充分利用系统资源,使得同样的资源可以服务更多的业务。通过将波峰、波谷期不同的业务系统部署到一个集群,以实现对系统资源最大限度的使用。

  3. 租户之间的隔离性:在数据安全方面,不允许跨租户的数据访问,确保用户的数据资产没有泄露的风险;在资源使用方面表现为租户“独占”其资源配额,该租户对应的前端应用,无论是响应时间还是TPS/QPS都比较平稳,不会受到其他租户负载轻重的影响。


体系架构

从概念上进行理解,可以把OceanBase1.x集群和MySQL实例做一个对比,简单地表述是这样的:一个OceanBase1.x集群对应 NMySQL的实例(因为OceanBase的扩展性强,N值可以很大);OceanBase1.x集群中的一个租户对应一个MySQL实例。

从逻辑层次上来看,数据库系统中的对象,不论是主体对象如用户(user)、角色(role),还是客体对象数据库(database)、表(table)、索引(index)、视图(view),都隶属于一个租户(tenant),并且只能属于一个租户。

租户(tenant)既是各类数据库对象的容器,又是资源(CPUMemoryIO等)的容器。



租户和用户

或许是因为都包含“户”字,这两个概念容易让人产生误会,但却是完全不同的两个概念。正如前面所说:租户对应的是一个MySQL数据库实例,是一个资源和对象的容器;而用户是容器里面的一个对象,和普通的MySQL实例里面的用户概念是相同的。


系统租户和普通租户

OceanBase1.x系统中包含两大类的租户:系统租户和普通租户。系统租户是系统内置的,主要有三个主要的功能:

  1. 系统表的容器。所有的系统表都存放在系统租户的空间中。

  2. 具备集群管理功能的用户的容器。集群级别的管理功能,比如增加/删除租户,修改系统配置项,每日合并等操作,只允许系统租户下的用户来做。

  3. 提供执行系统维护和管理行为所需的资源。像选主、每日合并等操作,目前没有按租户分离,这些操作所需的资源由系统租户来统一提供。

和系统租户相对应的是普通租户,普通租户可以被看作是一个MySQL的实例,它由系统租户根据需要(比如说为了某个业务的需要)创建出来。在创建租户的时候,除了指定租户名字以外,最重要的是指定它占用的资源情况。

既然普通租户等价于一个MySQL实例,它自然就具备一个实例所应该具有的所有特性:

  1. 可以创建自己的用户

  2. 可以创建数据库(database)、表(table)等所有客体对象

  3. 有自己独立的information_schema等系统数据库

  4. 有自己独立的系统变量

  5. MySQL实例所具备的其他特性

简短些说,当一个OceanBase1.x上的普通租户被创建出来以后,就相当于拥有了一个MySQL实例。


权限管理

OceanBase1.x中,不同租户之间的数据对象是完全隔离的,在对象的名字空间的最顶层就是租户。OceanBase1.x的权限管理可以由如下几点来进行概括:

  1. 任何租户(不论是系统租户还是普通租户)下的用户不能跨租户访问其他普通租户下的用户数据。

  2. 不支持跨租户对用户进行授权。举例来说就是:A租户下的管理员用户u1,不能将A租户下的表t1的读写权限授予B租户下的任何用户。

  3. 只有系统租户下的管理员用户才有集群管理权限,执行系统管理操作,如创建/删除普通租户、设置系统配置参数、开启每日合并操作。

  4. 普通租户下的用户及权限和MySQL实例类似,既有具备租户内管理员权限的特权用户,也有普通用户。权限的授予及回收也和单个MySQL实例相同。这是1.x兼容性开发的基本要求。

在系统设计及开发的过程中,对于第1点和第2点,是有争议的,尤其是考虑到DBA进行系统管理和维护方面的需求。了解Oracle 12C多租户的权限控制的同学都知道,Oracle里面是分为两种类型的用户的,通用用户(Common user)和本地用户(Local user),其中通用用户是可以被授予跨租户的权限来访问其他租户下的数据的。

最终,在便利性和安全性的选择上,OceanBase1.x系统选择了安全性,即使这会为系统管理带来一些额外的工作。

在跨租户数据访问方面有一个小小的例外,那就是普通租户下的用户,如果他具备访问系统视图的权限,实际上他是可以访问到系统租户下的系统表数据的,因为所有元信息都存放在系统租户下的系统表里,但这也仅限于访问该租户所有的系统对象的元信息。


资源隔离

在多租户的系统中,如果租户之间在资源使用上互相影响,会严重影响数据库服务对外提供服务的质量,导致基于这些数据库服务的前端业务的不稳定。所以,在多租户系统中,很重要的一点是要实现租户对资源的占用是近似于“独占”的,不能受到其他租户负载的影响。

OceanBase1.x当前的版本中,在资源隔离上的状态可以总结如下:

  1. 在整个集群内按照租户对象的访问热点情况,在节点间动态地调整配额,使得存放了热点数据的节点可以获得更多的执行资源。

  2. 在单个节点内,根据租户的配额以及租户的负载情况,进行CPU资源的动态分配,确保租户能够使用的CPU和其配额相匹配;同时在负载较轻的情况下出让多余的配额。

  3. 对租户在集群各节点上使用的内存资源进行总量控制。

OceanBase1.x的当前版本中,重点实现了对CPU资源的多租户隔离,详情后续单独撰文介绍。


总结

OceanBase1.x版本实现了基本的多租户功能,所有的数据库对象都是基于多租户的机制来进行管理和维护的,机器资源也是以租户的维度进行管理和调度的。可以说,多租户机制是1.x体系架构的基础设施之一。

多租户机制中有两个重要的问题要解决:一个是安全性;另一个是资源隔离性。对于安全性的问题,OceanBase1.x严格控制跨租户的数据访问,没有超级用户可以跨租户访问其他普通租户下的数据;对于资源隔离,每个租户都可以获取到和其配额匹配的计算资源和存储资源,不受其他租户的影响。

多租户机制是提供云数据库服务的一个基础设施,一切才刚刚开始。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存